using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Drawing;

namespace Repo {
	public class ColorCache {
		Gradient grad;
		public ColorCache() : this(null) { }
		public ColorCache(string gradStr) {
			grad=new Gradient();
			if(string.IsNullOrEmpty(gradStr))
			{
				grad.AddPoint(0,Color.White);
				grad.AddPoint(25,Color.Lime);
				grad.AddPoint(50,Color.Yellow);
				grad.AddPoint(75,Color.Red);
				grad.AddPoint(100,Color.Brown);
			}
			else
			{
				foreach(string p1 in gradStr.Split('|'))
				{
					string[] p2=p1.Split(':');
					Color c=default(Color);
					if(p2[1].StartsWith("#"))
						c=(Color)new ColorConverter().ConvertFromString(p2[1]);
					else
					{
						string[] p3=p2[1].Split(',');
						c=Color.FromArgb(int.Parse(p3[0]),int.Parse(p3[1]),int.Parse(p3[2]));
					}
					grad.AddPoint(int.Parse(p2[0]),c);

				}


			}
		}
		public static Color Convert(string strCol) {
			Color color=default(Color);
			if(strCol.StartsWith("#"))
				color=(Color)new ColorConverter().ConvertFromString(strCol);
			else
				color=Color.FromName(strCol);
			return color;
		}


		static Dictionary<string,Color> _colCache=new Dictionary<string,Color>();

		int hit,miss;

		public Color StrToColor(string str) {
			if(str=="&nbsp;")
				return default(Color);
			Color col;
			if(_colCache.TryGetValue(str,out col))
			{
				hit++;
				return col;
			}
			int hash=Math.Abs(str.GetHashCode()*7895);
			col=Color.FromArgb(245-(hash%130),245-(hash%100),245-(hash%115));
			_colCache.Add(str,col);
			miss++;
			return col;
		}

		//internal Color RedShade(float dummy,float max) {
		//  string key="_"+(dummy*100/max);
		//  Color col;
		//  if(_colCache.TryGetValue(key,out col))
		//  {
		//    hit++;
		//    return col;
		//  }
		//  col=System.Drawing.Color.FromArgb(255,240-(int)(230*((float)dummy/max)),240-(int)(230*((float)dummy/max)));
		//  miss++;
		//  _colCache.Add(key,col);
		//  return col;
		//}

		//Gradient grad=new Gradient(Color.White,Color.Red);
		internal Color HeatMap(float dummy,float max) {
			return grad.Get(dummy/max);

			//int pct=(int)(dummy*100/max);
			//string key="-"+pct;
			//Color col;
			//if(_colCache.TryGetValue(key,out col))
			//{
			//  hit++;
			//  return col;
			//}
			//col=grad.Get(dummy/max);
			//miss++;
			//_colCache.Add(key,col);
			//return col;
		}
		//internal Color HeatMap(float dummy,float max) {
		//  if(dummy<0)
		//    return Color.DeepSkyBlue;
		//  int pct=(int)(dummy*100/max);
		//  string key="-"+pct;
		//  Color col;
		//  if(_colCache.TryGetValue(key,out col))
		//  {
		//    hit++;
		//    return col;
		//  }

		//  int red=Math.Min(510*pct/100,255);
		//  int gre=Math.Min(510-510*pct/100,255);
		//  int blu=0;
		//  if(pct<20)
		//  {
		//    blu=240-220*pct*5/100;
		//    red=240-220*pct*5/100;
		//  }
		//  col=Color.FromArgb(red,gre,blu);
		//  miss++;
		//  _colCache.Add(key,col);
		//  return col;
		//}
	}
}
